#!/usr/bin/env python

import utiles
import servers
import MySQLdb
import MySQLdb.cursors
import string
from decimal import Decimal
import sys
import os

host=servers.host
user=servers.user
passwd=servers.passwd
db_name=servers.db_name

miBD=MySQLdb.connect(host=host,user=user,passwd=passwd,db=db_name)
miCursor=miBD.cursor()
miBDDict=MySQLdb.connect(host=host,user=user,passwd=passwd,db=db_name, cursorclass=MySQLdb.cursors.DictCursor)
miCursorDict=miBDDict.cursor()

lineaGuiones = "-"*101
lineaRenglon = "%8s %-34s %13s %13s %13s %13s"

def ordenCruda(consultaSQL):
    miCursor.execute(consultaSQL)
    auxiliar = miCursor.fetchall()
    return auxiliar

def ordenCrudaDict(consultaSQL, previo="SELECT 1"):
    miCursorDict.execute(previo)
    miCursorDict.execute(consultaSQL)
    auxiliar = miCursorDict.fetchall()    
    return auxiliar

def espacios(nrofactura,rellenar):
    aux = ""
    nrofactura = str(nrofactura)
    for i in range(rellenar-len(nrofactura)):
        aux += " "
    return aux+nrofactura

def invertirFecha(fecha):
    fecha = str(fecha)
    return fecha[8:10]+"-"+fecha[5:7]+"-"+fecha[2:4]

# *****************************************************************************

def listaClientes():
    sql = "SELECT idcliente,nombre,telefono FROM cliente"
    listaClientes = ordenCruda(sql)
    if listaClientes == (): listaClientes = None
    return listaClientes

def datosCliente(idcliente):
    sql = "SELECT nombre,telefono FROM cliente WHERE idcliente = '%s'" % (idcliente)
    datos = ordenCruda(sql)
    if datos != ():
        datos = (datos[0][0], datos[0][1])
    else:
        datos = None
    return datos

def printEncabezado(idcliente):
    datos = datosCliente(idcliente)
    nombre = datos[0]
    telefono = datos[1]
    print
    print idcliente,nombre,"Telf.: ",telefono
    print lineaGuiones
    #fecha vto. descripcion debe haber saldo
    print " FECHA   DESCRIPCION"," "*28,"     "," "*7,"DEBE"," "*7,"HABER"," "*7,"SALDO"
    print lineaGuiones

def mostrarTabla(idcliente,totales):
    sql = "SELECT * FROM vtas_detalle WHERE idcliente='%s' ORDER BY idcliente,fecha" % (idcliente)
    listaDatos = ordenCrudaDict(sql)
    if listaDatos == (): return totales

    idcliente_act = listaDatos[0]['idcliente']
    idcliente_ant = listaDatos[0]['idcliente']
    totCliente = [Decimal("0.00"),Decimal("0.00"),Decimal("0.00")]
    printEncabezado(idcliente_act)

    for renglon in listaDatos:

        idcliente_act = renglon['idcliente']
        
        if idcliente_act == idcliente_ant:
        
            fecha = renglon['fecha']
            detalle1 = renglon['detalle1']
            detalle2 = renglon['detalle2']
            debe  = renglon['debe']
            totCliente[0] += debe
            if debe == Decimal("0.00"): debe = ""
            haber = renglon['haber']
            totCliente[1] += haber
            if haber == Decimal("0.00"): haber = ""
            totCliente[2] = totCliente[0] - totCliente[1]
            print lineaRenglon % (invertirFecha(fecha),detalle1,detalle2,debe,haber,totCliente[2])
        
        else:
            totales[0] += totCliente[0]
            totales[1] += totCliente[1]
            
            idcliente_ant = idcliente_act
            totCliente = [Decimal("0.00"),Decimal("0.00"),Decimal("0.00")]
            printEncabezado(idcliente_act)

            fecha = renglon['fecha']
            detalle1 = renglon['detalle1']
            detalle2 = renglon['detalle2']
            debe  = renglon['debe']
            totCliente[0] += debe
            if debe == Decimal("0.00"): debe = ""
            haber = renglon['haber']
            totCliente[1] += haber
            if haber == Decimal("0.00"): haber = ""
            totCliente[2] = totCliente[0] - totCliente[1]
            print lineaRenglon % (invertirFecha(fecha),detalle1,detalle2,debe,haber,totCliente[2])

    print lineaGuiones
    print lineaRenglon % ("","Total cliente","",totCliente[0],totCliente[1],totCliente[2])
    totales[0] += totCliente[0]
    totales[1] += totCliente[1]
    return totales
        
    #    print lineaRenglon % (invertirFecha(registro['fecha']),registro['detalle1'],registro['detalle2'],registro['debe'],registro['haber'],"")
        
# *****************************************************************************

if __name__ == '__main__':

    if len(sys.argv) < 2:
        listaClientes = listaClientes()
    else:
        datos = datosCliente(sys.argv[1])
        if datos != None:
            listaClientes = [(sys.argv[1],datos[0],datos[1])]
        else:
            print "Cliente inexistente"
            sys.exit()

    totales = [Decimal("0.00"),Decimal("0.00"),Decimal("0.00")]

    for cliente in listaClientes:
        idcliente = cliente[0]
        totales = mostrarTabla(idcliente,totales)
    
    totales[2] = totales[0] - totales[1]
    print lineaGuiones
    print lineaRenglon % ("","TOTAL GENERAL","",totales[0],totales[1],totales[2])
    
    miCursor.close()
    miBD.close()
